package com.wwu.common;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;
import java.io.StringWriter;

/**
 * Jaxb2工具类：实现JavaBean和Xml之间的相互转换
 * @Author: 一蓑烟雨
 * @CreateTime: 2022-03-16 13:43
 * @Version: 1.0.0
 **/
public class JaxbUtil {

    /**
     * JavaBean转换成xml（默认编码,不带Header信息）
     * @param obj: Java对象
     * @return: java.lang.String
     * @Author: 一蓑烟雨
     * @Date: 2022/3/16 0016 下午 13:47
     */
    public static String convertToXml(Object obj){
        return convertToXml(obj,false,"UTF-8");
    }

    /**
     * JavaBean转换成xml（默认编码,带Header信息）
     * @param obj: Java对象
     * @return: java.lang.String
     * @Author: 一蓑烟雨
     * @Date: 2022/3/17 0017 下午 19:18
     */
    public static String convertToXmlHeader(Object obj){
        return convertToXml(obj,true,"UTF-8");
    }

    /**
     * JavaBean转换成xml（默认编码,不带Header信息）
     * @param obj: Java对象
     * @param escapeFlag:  是否转义<或>
     * @return: java.lang.String
     * @Author: 一蓑烟雨
     * @Date: 2022/3/17 0017 下午 14:43
     */
    public static String convertToXml(Object obj,boolean escapeFlag){
        if(escapeFlag){
            return convertToXml(obj,false,"UTF-8")
                    .replace("&lt;", '<' + "")
                    .replace("&gt;", '>' + "");
        }
        return convertToXml(obj,false,"UTF-8");
    }
    /**
     * JavaBean转换成xml（默认编码,带Header信息）
     * @param obj: Java对象
     * @param escapeFlag:  是否转义<或>
     * @return: java.lang.String
     * @Author: 一蓑烟雨
     * @Date: 2022/3/17 0017 下午 14:43
     */
    public static String convertToXmlHeader(Object obj,boolean escapeFlag){
        if(escapeFlag){
            return convertToXml(obj,true,"UTF-8")
                    .replace("&lt;", '<' + "")
                    .replace("&gt;", '>' + "");
        }
        return convertToXml(obj,true,"UTF-8");
    }

    /**
     * JavaBean转换成xml
     * @param obj: Java对象
     * @param headFlag: 是否带头部xml信息
     * @param encoding: 编码
     * @return: java.lang.String
     * @Author: 一蓑烟雨
     * @Date: 2022/3/16 0016 下午 13:47
     */
    public static String convertToXml(Object obj, Boolean headFlag,String encoding){
        String result = null;
        try {
            //应用的入口管理XML/Java绑定信息
            JAXBContext context = JAXBContext.newInstance(obj.getClass());
            //将Java对象序列化为XML数据
            Marshaller marshaller = context.createMarshaller();
            //在转换成xml时同时进行格式化,即标签自动换行
            //格式化输出
            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            marshaller.setProperty(Marshaller.JAXB_ENCODING, encoding);
            if(!headFlag){
                //带xml头信息
                marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
            }
            //值为空时生成空节点
            marshaller.setListener(new MarshallerListener());
            StringWriter writer = new StringWriter();
            marshaller.marshal(obj, writer);
            result = writer.toString();
        } catch (JAXBException e) {
            e.printStackTrace();
        }

        return result;
    }

    /**
     * xml转换成JavaBean
     * @param xml: xml字符串
     * @param c:JavaBean类
     * @return: JavaBean对象
     * @Author: 一蓑烟雨
     * @Date: 2022/3/16 0016 下午 13:46
     */
    @SuppressWarnings("unchecked")
    public static <T> T convertToJavaBean(String xml,Class<T> c){
        T t = null;
        try {
            JAXBContext context = JAXBContext.newInstance(c);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            t = (T)unmarshaller.unmarshal(new StringReader(xml));
        } catch (JAXBException e) {
            e.printStackTrace();
        }
        return t;
    }
}
